package cn.wzy.onlyoffice.utils.cos;

import cn.wzy.onlyoffice.config.CosConfig;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.model.GetObjectRequest;
import com.qcloud.cos.transfer.Download;
import com.qcloud.cos.transfer.MultipleFileDownload;
import com.qcloud.cos.transfer.TransferManager;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class cosDowbloadUtil {

    // 创建 TransferManager 实例，这个实例用来后续调用高级接口
    public static TransferManager createTransferManager() {
        // 创建一个 COSClient 实例，这是访问 COS 服务的基础实例。
        // 详细代码参见本页: 简单操作 -> 创建 COSClient
        COSClient cosClient = CosConfig.getCosClient();
        // 自定义线程池大小，建议在客户端与 COS 网络充足（例如使用腾讯云的 CVM，同地域上传 COS）的情况下，设置成16或32即可，可较充分的利用网络资源
        // 对于使用公网传输且网络带宽质量不高的情况，建议减小该值，避免因网速过慢，造成请求超时。
        ExecutorService threadPool = Executors.newFixedThreadPool(32);
        // 传入一个 threadpool, 若不传入线程池，默认 TransferManager 中会生成一个单线程的线程池。
        TransferManager transferManager = new TransferManager(cosClient, threadPool);
        return transferManager;
    }

    /*    // 存储桶的命名格式为 BucketName-APPID，此处填写的存储桶名称必须为此格式
        String bucketName = "examplebucket-1250000000";
        // 对象键(Key)是对象在存储桶中的唯一标识。详情请参见 [对象键](https://cloud.tencent.com/document/product/436/13324)
        String key = "exampleobject";*/
    public static Download download(String bucketName, String key, String localFilePath) {
        // 使用高级接口必须先保证本进程存在一个 TransferManager 实例，如果没有则创建
// 详细代码参见本页：高级接口 -> 创建 TransferManager
        final TransferManager transferManager = cosDowbloadUtil.createTransferManager();
        //本地存储路径
        File downloadFile = new File(localFilePath);
        Download download = null;
        GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
        try {
            // 返回一个异步结果 Donload, 可同步的调用 waitForCompletion 等待下载结束, 成功返回 void, 失败抛出异常
            download = transferManager.download(getObjectRequest, downloadFile);
            download.waitForCompletion();
        } catch (InterruptedException | CosClientException e) {
            e.printStackTrace();
        }

// 确定本进程不再使用 transferManager 实例之后，关闭之
// 详细代码参见本页：高级接口 -> 关闭 TransferManager
        cosDowbloadUtil.shutdownTransferManager(transferManager);
        return download;
    }

    ;

    public static void shutdownTransferManager(TransferManager transferManager) {
        // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。
        // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。
        transferManager.shutdownNow(true);
    }

    /**
     * 断点下载对象利用了分 range 多线程同时下载的方式下载对象，并在完成之后做完整性校验。如果下载过程中出现异常中断，重新下载时不会下载已经下载过的 range (源文件如果在重启前被修改，则会从头下载)。
     * 适合大文件下载。
     */
    public static Download downloads(String bucketName, String key, String localFilePath,
                                     boolean resumableDownload) {
        // 使用高级接口必须先保证本进程存在一个 TransferManager 实例，如果没有则创建
        // 详细代码参见本页：高级接口 -> 创建 TransferManager
        TransferManager transferManager = cosDowbloadUtil.createTransferManager();
        File downloadFile = new File(localFilePath);
        Download download = null;
        GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
        try {
            // 返回一个异步结果 Donload, 可同步的调用 waitForCompletion 等待下载结束, 成功返回 void, 失败抛出异常
            download = transferManager.download(getObjectRequest, downloadFile, resumableDownload);
            download.waitForCompletion();
        } catch (CosClientException | InterruptedException e) {
            e.printStackTrace();
        }
        cosDowbloadUtil.shutdownTransferManager(transferManager);
        return download;
    }

    ;

    /**
     * 下载到目录
     * // 存储桶的命名格式为 BucketName-APPID，此处填写的存储桶名称必须为此格式
     *
     * @String bucketName = "examplebucket-1250000000";
     * // 设置要下载的对象的前缀（相当于cos上的一个目录），如果设置成 ""，则下载整个 bucket。
     * String cos_path = "/prefix";
     * // 要保存下载的文件的文件夹的绝对路径
     * String dir_path = "/to/mydir";
     */
    public static MultipleFileDownload downloadDirectory(String bucketName, String cos_path, String dir_path) {
        // 使用高级接口必须先保证本进程存在一个 TransferManager 实例，如果没有则创建
        // 详细代码参见本页：高级接口 -> 示例代码：创建 TransferManager
        TransferManager transferManager = cosDowbloadUtil.createTransferManager();
        MultipleFileDownload download = null;
        try {
            // 返回一个异步结果download, 可同步的调用waitForUploadResult等待download结束.
            download = transferManager.downloadDirectory(bucketName, cos_path, new File(dir_path));
            // 或者阻塞等待完成
            download.waitForCompletion();

            System.out.println("download directory done.");
        } catch (InterruptedException | CosClientException e) {
            e.printStackTrace();
        }

// 确定本进程不再使用 transferManager 实例之后，关闭之
// 详细代码参见本页：高级接口 -> 示例代码：关闭 TransferManager
        cosDowbloadUtil.shutdownTransferManager(transferManager);
        return download;
    }


    public static void main(String[] args) {
        //cosDowbloadUtil.download("ems-1311510668","rizhi.png","D:\\360"+"\\"+"rizhi.png");
        cosDowbloadUtil.downloadDirectory("ems-1311510668", "/preif", "D:\\360");
    }

    public static Boolean shangchuan(MultipartFile multipartFile) {
        // multipartFile.transferTo(new File(realPath,aa.getOriginalFilename()));//文件上传
        return Boolean.TRUE;
    }

}